package com.sisgesbyte.services.sistema;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import com.sisgesbyte.common.ConstantesInternasSistema;
import com.sisgesbyte.common.ObjetoXmlUtil;
import com.sisgesbyte.dao.auditoria.AuditoriaDao;
import com.sisgesbyte.dao.beanDao.LogRequest;
import com.sisgesbyte.dao.beanDao.RegistrarAccesoRequest;
import com.sisgesbyte.dao.beanDao.UsuarioRequest;
import com.sisgesbyte.dao.beanDao.ValidaLocalizacionRequest;
import com.sisgesbyte.dao.beanDao.ValidarHostRequest;
import com.sisgesbyte.dao.seguridad.SeguridadDao;
import com.sisgesbyte.dao.sistema.SistemaDao;
import com.sisgesbyte.data.entity.auditoria.InsertaLogEntity;
import com.sisgesbyte.data.entity.seguridad.AccesoHost;
import com.sisgesbyte.data.entity.seguridad.LogAccesoEntity;
import com.sisgesbyte.data.entity.seguridad.RestriccionesEntity;
import com.sisgesbyte.data.entity.seguridad.ValidaLocalizacionEntity;
import com.sisgesbyte.data.entity.seguridad.ValidaUsuarioEntity;
import com.sisgesbyte.data.entity.sistema.ValidaEmpresaEntity;
import com.sisgesbyte.services.sistema.bean.ValidaAccesoRequest;
import com.sisgesbyte.services.sistema.bean.ValidaAccesoResponse;

@Stateless
public class AccesoSistemaImpl implements AccesoSistema {

	@EJB
	private SistemaDao sistema;

	@EJB
	private SeguridadDao seguridad;

	@EJB
	private AuditoriaDao auditoria;

	protected Map<String, Boolean> map = new HashMap<String, Boolean>();
	protected String nameCompany = null;
	protected String idTrans = null;
	protected String nameUser = null;
	protected String metodo = null;
	protected String navegador = null;

	@Override
	public ValidaAccesoResponse validarAccesoUsuario(
			ValidaAccesoRequest parameter) {
		String mensajeTransaccionMetodo = "[validarAccesoUsuario - ]";
		System.out.println(mensajeTransaccionMetodo +"Parametros de Entrada : " + ObjetoXmlUtil.anyObjectToXmlText(parameter));
		ValidaEmpresaEntity validaSistema = null;
		ValidaUsuarioEntity validaUsuario = null;
		ValidaLocalizacionEntity validaLocalizacion = null;
		LogAccesoEntity logAccesoEntity = null;
		AccesoHost host = null;
		nameCompany = ConstantesInternasSistema.NOMBRE_EMPRESA;
		idTrans = parameter.getIdTransaccion();
		nameUser = parameter.getUsuario();
		metodo = "validarAccesoUsuario";
		navegador = parameter.getNavegador();
		ValidaAccesoResponse response = new ValidaAccesoResponse();

		ValidaLocalizacionRequest reqLocalizacion = new ValidaLocalizacionRequest();
		try {
			// 1. Validar Empresa
			try {

				validaSistema = sistema.validarEmpresa(parameter.getCodEmpresa());

				if (validaSistema.getCoderror() != Integer.valueOf(ConstantesInternasSistema.CODIGO_EXITO)) {
					registrarError(Integer.valueOf(ConstantesInternasSistema.VALIDAR_ACCESO_COD_IDF5),
									ConstantesInternasSistema.VALIDAR_ACCESO_MSJ_IDF5.replace("{msj}", validaSistema.getMsjerror())
									);
					response.setCodigoRespuesta(ConstantesInternasSistema.VALIDAR_ACCESO_COD_IDF5);
					response.setMensajeRespuesta(ConstantesInternasSistema.VALIDAR_ACCESO_MSJ_IDF5.replace("{msj}", validaSistema.getMsjerror()));
					return response;
				}

			} catch (Exception e) {
				response.setCodigoRespuesta(ConstantesInternasSistema.VALIDAR_ACCESO_COD_IDT5);
				response.setMensajeRespuesta(ConstantesInternasSistema.VALIDAR_ACCESO_MSJ_IDT5);
			}

			// 2. validar credenciales de usuario
			try {
				UsuarioRequest responseUsuario = new UsuarioRequest();
				responseUsuario.setCodEmpresa(parameter.getCodEmpresa());
				responseUsuario.setUsuario(parameter.getUsuario());
				responseUsuario.setClave(parameter.getClave());
				validaUsuario = seguridad.validarAcceso(responseUsuario);

				if (validaUsuario.getCod_error() == Integer.valueOf(ConstantesInternasSistema.CODIGO_EXITO)) {
					response.setCodUsuario(validaUsuario.getCod_user());
					response.setCodRol(validaUsuario.getCod_rol());
				} else {
					registrarError(Integer.valueOf(ConstantesInternasSistema.VALIDAR_ACCESO_COD_IDF3),
									ConstantesInternasSistema.VALIDAR_ACCESO_MSJ_IDF3.replace("{msj}", validaUsuario.getMsj_error())
									);
					response.setCodigoRespuesta(ConstantesInternasSistema.VALIDAR_ACCESO_COD_IDF3);
					response.setMensajeRespuesta(ConstantesInternasSistema.VALIDAR_ACCESO_MSJ_IDF3.replace("{msj}", validaUsuario.getMsj_error()));

					return response;
				}
			} catch (Exception e) {
				response.setCodigoRespuesta(ConstantesInternasSistema.VALIDAR_ACCESO_COD_IDT3);
				response.setMensajeRespuesta(ConstantesInternasSistema.VALIDAR_ACCESO_MSJ_IDT3);
			}

			// 3. Validar localización

			try {
				// cargamos las restricciones
				obtenerListaRestricciones(parameter.getCodEmpresa());

				reqLocalizacion.setCodEmpresa(parameter.getCodEmpresa());
				reqLocalizacion.setCodUsuario(validaUsuario.getCod_user());
				reqLocalizacion.setContinente(parameter.getContinente());
				reqLocalizacion.setActContinente(map.get(ConstantesInternasSistema.VALIDAR_CONTINENTE.trim()));
				reqLocalizacion.setDivisionPais(parameter.getRegion());
				reqLocalizacion.setActDivPais(map.get(ConstantesInternasSistema.VALIDAR_DIVISION.trim()));
				reqLocalizacion.setPais(parameter.getPais());
				reqLocalizacion.setActPais(map.get(ConstantesInternasSistema.VALIDAR_PAIS.trim()));
				reqLocalizacion.setCiudad(parameter.getCiudad());
				reqLocalizacion.setActCiudad(map.get(ConstantesInternasSistema.VALIDAR_CIUDAD.trim()));

				validaLocalizacion = seguridad.validarLocalizacion(reqLocalizacion);

				if (validaLocalizacion.getCod_error() != Integer.valueOf(ConstantesInternasSistema.CODIGO_EXITO)) {

					registrarError(
							Integer.valueOf(ConstantesInternasSistema.VALIDAR_ACCESO_COD_IDF2),
							ConstantesInternasSistema.VALIDAR_ACCESO_MSJ_IDF2.replace("{msj}", validaLocalizacion.getMsj_error())
							);
					
					response.setCodigoRespuesta(ConstantesInternasSistema.VALIDAR_ACCESO_COD_IDF2);
					response.setMensajeRespuesta(ConstantesInternasSistema.VALIDAR_ACCESO_MSJ_IDF2.replace("{msj}", validaLocalizacion.getMsj_error()));

					return response;
				}

			} catch (Exception e) {

				response.setCodigoRespuesta(ConstantesInternasSistema.VALIDAR_ACCESO_COD_IDT2);
				response.setMensajeRespuesta(ConstantesInternasSistema.VALIDAR_ACCESO_MSJ_IDT2);
			}

			// 4. validar Host

			try {
				ValidarHostRequest reqHost = new ValidarHostRequest();
				reqHost.setCodEmpresa(parameter.getCodEmpresa());
				reqHost.setCodUsuario(validaUsuario.getCod_user());
				reqHost.setIpPublica(parameter.getIpPublicaCliente());
				reqHost.setActIpp(map.get(ConstantesInternasSistema.VALIDAR_IPPUBLICA));
				reqHost.setIpLocal(parameter.getIpPrivadaCliente());
				reqHost.setActIpl(map.get(ConstantesInternasSistema.VALIDAR_IPLOCAL));
				reqHost.setMacHost(parameter.getMacCliente());
				reqHost.setActMac(map.get(ConstantesInternasSistema.VALIDAR_MAC));
				host = seguridad.validarHost(reqHost);

				if (host.getCod_error() != Integer.valueOf(ConstantesInternasSistema.CODIGO_EXITO)) {
					registrarError(Integer.valueOf(ConstantesInternasSistema.VALIDAR_ACCESO_COD_IDF1),
									ConstantesInternasSistema.VALIDAR_ACCESO_MSJ_IDF1.replace("{msj}", host.getMsj_error())
								);
					
					response.setCodigoRespuesta(ConstantesInternasSistema.VALIDAR_ACCESO_COD_IDF1);
					response.setMensajeRespuesta(ConstantesInternasSistema.VALIDAR_ACCESO_MSJ_IDF1.replace("{msj}", host.getMsj_error()));
					return response;
				}

			} catch (Exception e) {
				response.setCodigoRespuesta(ConstantesInternasSistema.VALIDAR_ACCESO_COD_IDT1);
				response.setMensajeRespuesta(ConstantesInternasSistema.VALIDAR_ACCESO_MSJ_IDT1);
			}

			// 5. Registrar acceso

			try {
				RegistrarAccesoRequest reqAcceso = new RegistrarAccesoRequest();
				reqAcceso.setEmpresa(ConstantesInternasSistema.NOMBRE_EMPRESA);
				reqAcceso.setUsuario(parameter.getUsuario());
				reqAcceso.setCodTrans(parameter.getIdTransaccion());
				reqAcceso.setTipoHost(parameter.getTipoHost());
				reqAcceso.setMarcaHost(parameter.getMarcaHost());
				reqAcceso.setNavegador(parameter.getNavegador());
				reqAcceso.setIpPublica(parameter.getIpPublicaCliente());
				reqAcceso.setIpEstatica(parameter.getIpPrivadaCliente());
				reqAcceso.setContinente(parameter.getContinente());
				reqAcceso.setPais(parameter.getPais());
				reqAcceso.setRegion(parameter.getRegion());
				reqAcceso.setCiudad(parameter.getCiudad());
				reqAcceso.setLatmap(parameter.getLat());
				reqAcceso.setLngmap(parameter.getLng());
				reqAcceso.setActive(parameter.getActive());

				logAccesoEntity = seguridad.registrarAcceso(reqAcceso);

				if (logAccesoEntity.getCod_error() == Integer.valueOf(ConstantesInternasSistema.CODIGO_EXITO)) {
					response.setCodigoRespuesta(ConstantesInternasSistema.CODIGO_EXITO);
					response.setMensajeRespuesta(ConstantesInternasSistema.MENSAJE_EXITO);

				} else {
					registrarError(
							Integer.valueOf(ConstantesInternasSistema.VALIDAR_ACCESO_COD_IDF4),
							ConstantesInternasSistema.VALIDAR_ACCESO_MSJ_IDF4.replace("{msj}", logAccesoEntity.getMsj_error())
							);
					
					response.setCodigoRespuesta(ConstantesInternasSistema.VALIDAR_ACCESO_COD_IDF4);
					response.setMensajeRespuesta(ConstantesInternasSistema.VALIDAR_ACCESO_MSJ_IDF4.replace("{msj}", logAccesoEntity.getMsj_error()));
					return response;
				}

			} catch (Exception e) {
				response.setCodigoRespuesta(ConstantesInternasSistema.VALIDAR_ACCESO_COD_IDT4);
				response.setMensajeRespuesta(ConstantesInternasSistema.VALIDAR_ACCESO_MSJ_IDT4);
			}

		} catch (Exception e) {
			System.out.println(e + e.getMessage());
		}
		
		return response;
	}

	public void obtenerListaRestricciones(int codEmpresa) {

		try {
			List<RestriccionesEntity> list = seguridad.listarRestricciones(codEmpresa);

			for (RestriccionesEntity ls : list) {
				map.put(ls.getRestriccion().trim(), ls.isActive());
			}

		} catch (Exception e) {
			System.out.println("Problemas a cargar Restricciones");
		}

	}

	public void registrarError(int codError, String msjError) {
		//6. Registrar Error
		LogRequest reqLog = new LogRequest();
		reqLog.setCodtransaccion(idTrans);
		reqLog.setCodError(codError);
		reqLog.setEmpresa(nameCompany);
		reqLog.setMetodo(metodo);
		reqLog.setMsjError(msjError);
		reqLog.setNavegador(navegador);
		reqLog.setUsuario(nameUser);
		try {
			InsertaLogEntity logError = auditoria.registrarLog(reqLog);

			if (logError.getCod_error() == Integer.valueOf(ConstantesInternasSistema.CODIGO_EXITO)) {

				System.out.println("Se registro el Error de acceso Correctamente");

			}

		} catch (Exception e) {
			System.out.println("Error al insertar error de acceso : "+ e.getMessage());
		}
	}
}
